package cn.bonoon.kernel.web.annotations.components;

import cn.bonoon.kernel.support.entities.Persistable;
import cn.bonoon.kernel.web.annotations.AutoDataLoader;
import cn.bonoon.kernel.web.annotations.grid.GridExtends;
/**
 * <pre>
 * 必须指定的属性有{@link #name()}
 * 
 * 内容项的定义需要使用{@link #value()}
 * </pre>
 * @author jackson
 *
 */
public @interface TabItem {
	/**
	 * <pre>
	 * tab项的内容，根据不同的类型(TabItemType)进行解析，定义如下：
	 * 
	 * VARIABLE  变量，后台可通过model.addAttribute等来进行赋值
	 * HREF      连接，tabs通过ajax方式加载另一个界面
	 * CONTENT   直接文字内容
	 * INCLUDE   vm的路径，使用velocity的#include进行包含
	 * PARSE     vm的路径，使用velocity的#parse进行包含
	 * 
	 * DETAIL    解析另一个详细页面，使用{@link #clazz()}属性，value()用来指定对象的名称，即：detail2.name
	 * GRID      是以下两种可能的情况；判断是DATAGRID或TREEGRID由{@link #clazz()}属性所指向的实体对象来决定,
	 *           如果没有指定{@link #loader()}，则需要自己指定value来指定加载路径
	 * 
	 * DATAGRID  解析成datagrid列表，这里是读取datagrid数据的地址
	 * TREEGRID  解析成treegrid树形列表，这里是读取treegrid数据的地址
	 * 
	 * 注意：如果是DATAGRID，TREEGRID类型，则需要有ID的字段，或者可以通过URL来传值
	 * </pre>
	 * 
	 * <pre>
	 * 当"{@link #type()}={@link TabItemType#GRID}"时，并且使用了自动加载(也就是使用{@link #loader()}模式)时，
	 * value的值将被认为是需要传过去给{@link #loader()}处理的参数；这个参数值来自于{@link #loader()}中定义的实体的字段；
	 * 如：当loader=@AutoDataLoader(AccountEntity.class);的时候
	 * 当value="role"，则会自动解析成：x.role.id=?并且把当前表示的id传过去
	 * 
	 * 这种方式下，当前所在的表单(detail/update/inserte)必须有id这个字段
	 * </pre>
	 * @return
	 */
	String value() default "";
	
	/**
	 * 只有当类型被指定为DETAIL,GRID(DATAGRID或TREEGRID)时有效
	 * @return
	 */
	Class<?> clazz() default Object.class;
	
	GridExtends gridExtends() default @GridExtends;
	/**
	 * <pre>
	 * 这里只允许0或1个值，如果出现多个值，则只有第一个值有效
	 * 该属性只针对<code>{@link #type()}=GRID</code>时有效，其它类型的将不会使用到该值
	 * 
	 * 当使用自动加载数据时，一般认为该grid的数据应该是所属对象的一个关系集合，
	 * 如：用户与角色，如果该界面显示的是用户信息，则grid列表则应该是该用户所拥有的角色，
	 * 这时{@link #value()}应该是指向角色中指向用户的外键
	 * </pre>
	 * @return
	 */
	AutoDataLoader loader() default @AutoDataLoader(Persistable.class);
	
	/**
	 * 显示在tabs上的名字
	 * @return
	 */
	String name();
	
	/**
	 * 每一个tab项可以指定它的ID
	 * @return
	 */
	String id() default "";
	
	boolean closable() default false;
	String iconCls() default "";
	
	/**
	 * 这里是指显示在tab子页面内的tool工作栏，里面可以添加按钮、文本框等内容
	 * @return
	 */
	String tools() default "";
	/**
	 * 指定当前tabs页的类型
	 * @return
	 * @see TabItemType
	 */
	TabItemType type() default TabItemType.VARIABLE;
	/**
	 * <pre>
	 * tab项的类型
	 * </pre>
	 * @author jackson
	 *
	 */
	public enum TabItemType{
		VARIABLE, HREF, CONTENT, INCLUDE, PARSE, DETAIL, 
		/**
		 * @Deprecated 请使用 GRID
		 */
		@Deprecated
		DATAGRID, 
		/**
		 * @Deprecated 请使用 GRID
		 */
		@Deprecated
		TREEGRID, 
		GRID
	}
}
